<?php
/**
 * Noyau
 * 
 * @author Jérémy Paul ( jeremy@openzax.org )
 * @package Zax
 */
class Zax
{	
	/**
	 * Getter
	 * Permet d'accéder aux modules du noyau grâce à la syntaxe suivante:
	 * 
	 * | global $Zax;
	 * | ...
	 * | $Zax->nom_module->action();
	 * 
	 */
	public function __get($module)
	{
		require_once(ZAX_SYSTEM_PATH."/Core/$module.zmod.php");
		$class = 'Zax_Module_'.ucfirst($module);
		$this->$module = new $class;
		return $this->$module;
	}
	
	/**
	 * Initialise Zax
	 * Prend en paramètre le chemin du répertoire de l'installation
	 * à exécuter.
	 * 
	 * @param $data_path
	 */
	public function start($data_path)
	{
		session_start();
		//Définir le répertoire système (system) et le répertoire utilisateur (data)
		$data_path = realpath($data_path).'/';
		$sys_path  = realpath(dirname(__FILE__).'/../').'/';
		
		define('ZAX_DATA_PATH'   ,$data_path);
		define('ZAX_SYSTEM_PATH' ,$sys_path );
		
		$this->conf->load('zax' );		
		$this->conf->load('site');
	}
	
	/**
	 * Charge une librairie externe
	 * 
	 * @param $lib_name
	 */
	public function loadLib($lib_name)
	{
		require_once ZAX_SYSTEM_PATH.'/Libraries/'.$lib_name.'/Zax_libload.php';
	}
	
	/**
	 * Exécute une requête Zax et assigne son retour à la position
	 * $position du template.
	 * @param string $query
	 * @param string $position
	 */
	public function exec($query,$position)
	{
		//Quel est le noeud, et l'action à faire
		$args = explode(':',$query);
		$node = $args[0];
		if(isset($args[1])) $action = $args[1];
		else $action = '_default';
		
		//Constantes utiles
		define('ZAX_QUERY',$query);
		define('ZAX_QUERY_NODE',$node);
		define('ZAX_QUERY_ACTION',$action);
		
		//Détection d'éventuels paramètres pour l'action:
		@list($action,$action_params) = explode('(',$action);
		if($action_params)
		{
			$action_params = explode(',',str_replace(')','',$action_params));
		}
		
		//Serait-ce un répertoire par hasard?
		if(substr($node,-1) === '/')
			$default_app = "Default_Dir";
		else
			$default_app = "Default_File";
			
		
		//$ext est l'extension du fichier
		$ext = end(explode('.',$node));

		//On charge les associations afin de déterminer avec quelle App ouvrir ce fichier
		$this->conf->load('assoc');
		
		defined('CONF_ASSOC_'.strtoupper($ext)) ?
			$app = constant('CONF_ASSOC_'.strtoupper($ext)):
			$app = $default_app;
		
		//Peut être y avait-il un paramètre? application(parametre)
		list($app,$app_param) = explode('(',"$app(");
		if(!empty($app_param))
		{
			$app_param = strtr($app_param,')','');
		}
		
		//Sortie si erreur:
		$output = LNG_ZAX_ERROR;
		
		//$acl = $this->acl->checkFile($node);
		//if($acl['r'] === true)
		if(1)
		{
			$App = $this->app->load($app,$app_param,$node);
					
			$method = 'Action_'.$action;
			if (is_callable(array($App,$method)))
				$output = call_user_func_array(array($App,$method),$action_params);
				
		}
		$this->template->assignFrame($position,'',$output);
		if($position == "mainframe")
			$this->template->setAppToolbar($App->App_getActionsToolbar());
	}
	
	/**
	 * Envoie la page générée au navigateur.
	 * @param string $output_mode
	 * @param string $ob_handler
	 */
	public function show($output_mode = 'main' ,$ob_handler = null)
	{
		//Quelqu'un a déjà écrit?
		if(headers_sent($filename,$line))
			return("$filename($line)");
		
		$this->template->outputNow();
	}
}
